package com.qf.controller;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author fy
 * @version V1.0
 * @Project workspace
 * @Package com.qf.controller
 * @Description:
 * @Date 2022/6/19 1:20
 */
@Controller
public class LoginController {

    /**
     * 用户登录
     * @param username 页面输入用户名
     * @param password 页面输入密码
     * @param rememberMe 是否记住我
     * @return
     */
    @RequestMapping("/doLogin")
    public String doLogin(String username,String password,boolean rememberMe){

        //1.将页面输入的明文密码，进行md5加密
         password = new Md5Hash(password, username, 1024).toString();
        System.out.println("======密码密文======"+password);

        //2.将页面输入的用户名、密码封装成shiro需要的用户名密码对象
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);

        //3.判断是否需要记住我，如果需要，设置记住我选项
        if (rememberMe){
            token.setRememberMe(true);
        }

        //4.获取subject对象，这个是shiro框架的，当前登录用户对象
        Subject subject = SecurityUtils.getSubject();


        try {
            //5.调用当前登录对象的认证方法，将用户名密码对象传入，进行shiro认证
            //当调用这个login方法时，那么shiro会自动执行Realm类中的认证方法
            subject.login(token);
        } catch (UnknownAccountException e) {
            return "/login.jsp";
        }catch (IncorrectCredentialsException e) {
            return "/login.jsp";
        }catch (AuthenticationException e) {
            return "/login.jsp";
        }
        return "/index.jsp";
    }

    /**
     *注销退出
     * @return
     */
    @RequestMapping("/logout")
    public String logOut(){
        //1.获取subject对象，当前登录用户对象
        Subject subject = SecurityUtils.getSubject();
        //2.调用退出方法，清楚shiro框架中session中保存的用户信息
        subject.logout();
        //3.跳转到用户登录界面
        return "/login.jsp";
    }
}
